package kotlindemo.com.kotlindemo

import kotlinx.coroutines.*

//协程：kotlin为了解决高并发编程推出的一个特色功能，可以理解为轻量级的线程，
//协程允许在单线程模式下模拟多线程的效果
fun main(args: Array<String>) {
   //--------------------------------- GlobalScope.launch函数创建的协程都是顶层协程------------------------
   GlobalScope.launch {
      println("code run in coroutine scope")
      //Thread.sleep会阻塞当前线程，这样运行在当前线程下的所有协程都会进入阻塞状态
      Thread.sleep(1000)
   }
   //------------------------------------runblocking函数-------------------------------------
   runBlocking {//runblock函数会创建一个协程作用域，他可以保证在协程作用域内的所有代码和子协程没有全部执行完之前一直阻塞当前线程
      println("code run in coroutine scope")
      //delay函数是一个非阻塞式的挂起函数，它只会挂起当前协程，不会影响其他协程的运行
      //注意delay函数只能在协程的作用域或者其他的挂起函数中使用
      delay(1500)

      println("code run in coroutine scope finished")
   }
   //-------------------------创建多个协程--------------------------------------
   runBlocking {
      //launch函数用来创建多个协程，只能用于协程作用域
      launch {
         println("launch1")
         delay(1000)
         println("launch1 finished")
      }
      launch {
         println("launch2")
         delay(1000)
         println("launch2 finished")
      }
   }
   //--------------------------------------实例来验证协程的效率-----------------------------------------
   val start=System.currentTimeMillis()
   runBlocking {
      repeat(100000){
         launch {
            println(".")
         }
      }
   }
   val end=System.currentTimeMillis()
   println(end-start)
   //--------------------suspend关键字与coroutineScope函数搭配使用，继承外部的协程作用域，创建一个子协程作用域，方便我们将协程提成一个函数--------------------
   //英 [səˈspend]   美 [səˈspend]
   //v.悬;挂;吊;暂停;中止
   runBlocking {
      launch {
         prinDot()
      }
   }
   //----------------coroutineScope函数与runBlock函数一样，在其作用域内的所有代码和子协程代码全部执行完毕之前，会一直阻塞当前协程-----------------
   runBlocking {
      coroutineScope {//以下是协程作用域
         launch {//以下是子作用域
            for (i in 1..10){
               println(i)
               delay(1000)
            }
         }
      }
      println("coroutineScope finished")
   }
   println("runBlocking finished")
   //coroutineScope函数只会阻塞当前协程与runBlock函数会阻塞当前线程，因此如果在主线程中使用runBlock 则有可能anr
}
suspend fun prinDot()= coroutineScope {//coroutineScope函数与runBlock函数一样，在其作用域内的所有代码和子协程代码全部执行完毕之前，会一直阻塞当前协程
   launch {
      println(".")
      delay(1000)
   }
}